﻿using System;
using System.Windows.Forms;
using CRC.Inspecciones.Dominio.Controlador;
using CRC.Formularios;
using CRC.UserControls;
using System.Collections.Generic;

namespace CRC.Inspecciones.Presentacion
{
    public partial class UsrHojaInspeccion : UserControl
    {
        private LinkedList<ListaHojasInspeccionListener> listaHojasInspeccionListeners = new LinkedList<ListaHojasInspeccionListener>();
        private ControladorModificarHojaInspeccion cMHI = new ControladorModificarHojaInspeccion();       
        
        private Object[] infoHoja = null;
        private int intHoja;   
                
        /*
         *Constructor por defecto 
        */
        public UsrHojaInspeccion()
        {
            InitializeComponent();
        }

        public UsrHojaInspeccion(int pIntHoja): this() {
            this.intHoja = pIntHoja;
            ObtenerDatosHojaInspeccion(pIntHoja);
        }

        /**
         * ObtenerDatosHojaInspeccion: Obtiene los datos de la hoja 
         * y el documento HTML correspondiente al tipo de hoja
         * pre: -
         * 
         * post: 
         *  2.1 Llama a ControladoroMdoificaHojaInspeccion.obtenerHojaInspeccion(...)
         *  y deja el resultado en this.infoHoja
         *  2.2 wB.DocumentText <- documento html
         *  2.3 Configura los botones de guardar e imprimir
         * 
        */
        private void ObtenerDatosHojaInspeccion(int pIntHoja)
        {
            try {

                this.infoHoja = cMHI.obtenerInfoHojaInspeccion(pIntHoja);
                wB.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wB_DocumentCompleted);
                this.wB.DocumentText = (String)this.infoHoja[5]; // Document HTML correspondiente al tipo de hoja

                if ((Boolean)this.infoHoja[8]){ //Borrador
                    this.butImprimirHoja.Enabled = false;
                }
                else //Hoja no modificable
                {  
                    this.butImprimirHoja.Enabled = true;
                    this.butGuardarBorrador.Enabled = false;
                    this.butGuardarDefinitiva.Enabled = false;
                }
                            
            } catch (Exception ex) {
                MessageBox.Show(ex.Message, "Error", 
                    MessageBoxButtons.OK, MessageBoxIcon.Error
                );
            }
        }
        
        /**
         * LlenarCamposDerivables: llena los campos cuya información se puede derivar del salón
         * para la que se està haciendo la inspeccion
         * 
        **/
        private void LlenarCamposDerivables(){

             String strTipoHoja = (String)this.infoHoja[7];

            //////// Cargar campos que pueden saberse de antemano ///////////
            if (strTipoHoja.CompareTo("0000000001") == 0) { 

                //Congregacio anfitriona
                wB.Document.GetElementById("txtCongrAnfi").SetAttribute("value", (String)this.infoHoja[0]);
                //Ciudad del salon
                wB.Document.GetElementById("txtCiudad").SetAttribute("value", (String)this.infoHoja[1]);
                //Provincia del salon
                wB.Document.GetElementById("txtProvincia").SetAttribute("value", (String)this.infoHoja[2]);
                //Numero de la congregacion anfitriona
                wB.Document.GetElementById("txtNumCong").SetAttribute("value", this.infoHoja[3].ToString());
                //Congregaciones que comparten el salon
                wB.Document.GetElementById("txtNotas").SetAttribute("value", (String)this.infoHoja[4]);
            }
            else if (strTipoHoja.CompareTo("0000000002") == 0)
            {
                //Congregacio anfitriona
                wB.Document.GetElementById("txtCongregacion").SetAttribute("value", (String)this.infoHoja[0]);
                //Ciudad del salon
                wB.Document.GetElementById("txtCiudad").SetAttribute("value", (String)this.infoHoja[1]);
                //Provincia del salon
                wB.Document.GetElementById("txtProvincia").SetAttribute("value", (String)this.infoHoja[2]);
                //Numero de la congregacion anfitriona
                wB.Document.GetElementById("txtNumCongAnfi").SetAttribute("value", this.infoHoja[3].ToString());
                //Congregaciones que comparten el salon
                wB.Document.GetElementById("txtDireccionSalon").SetAttribute("value", (String)this.infoHoja[4]);
            }
            else if (strTipoHoja.CompareTo("0000000003") == 0 || strTipoHoja.CompareTo("0000000004") == 0)
            {
                wB.Document.GetElementById("idtxt_salon").SetAttribute("value", (String)this.infoHoja[9]);
                wB.Document.GetElementById("idtxt_conganfi").SetAttribute("value", this.infoHoja[0].ToString());
                wB.Document.GetElementById("idtxt_conganfi_num").SetAttribute("value", (String)this.infoHoja[3].ToString());
                wB.Document.GetElementById("idtxt_cong_otras").SetAttribute("value", this.infoHoja[4].ToString());
                wB.Document.GetElementById("idtxt_direccion").SetAttribute("value", this.infoHoja[10].ToString());
                wB.Document.GetElementById("idtxt_cp").SetAttribute("value", this.infoHoja[11].ToString());
                wB.Document.GetElementById("idtxt_poblacion").SetAttribute("value", this.infoHoja[2].ToString());
            }
        }

        /**
         * LlenarCamposHTML: llena los campos de la hoja (campos text, checkboxes y textareas) 
         * con la informacion de this.infoHoja
         */
        private void LlenarCamposHTML() {
            try
            {
                String strValoresEtiquetados = (String)this.infoHoja[6];

                char[] delimiterChars = { '<', '>' };
                string[] arr = strValoresEtiquetados.Split(delimiterChars);

                string t = ""; //Type
                string id = ""; // Id campo 
                string v = ""; // Valor
                // Ejemplo -> [Id]<txtCong>[Value]<Tarragona Oeste>[Id]<txtCiudad>[Value]<Constantí>

                int index = 0;
                string q;

                while (index < arr.Length - 1)
                {
                    q = arr[index];

                    if (q == "[Id]") { t = q; }
                    if (q == "[Value]") { t = q; }
                    if (q == "[InnerText]") { t = q; }

                    if (t == "[Id]" & q != "[Id]") { id = q; }

                    if (t == "[Value]" & q != "[Value]")
                    {
                        v = q;
                        if (wB.Document.GetElementById(id) != null)
                        {
                            if (wB.Document.GetElementById(id).GetAttribute("type") == "checkbox")
                            {
                                if (v == "True")
                                {
                                    wB.Document.GetElementById(id).SetAttribute("checked", v);
                                }

                            }
                            else
                            {
                                wB.Document.GetElementById(id).SetAttribute("value", v);
                            }
                        }
                       
                    }
                    if (t == "[InnerText]" & q != "[InnerText]")
                    {
                        v = q;
                        if (wB.Document.GetElementById(id) != null)
                        {
                            wB.Document.GetElementById(id).InnerText = v;                        
                        }

                    }

                    index = index + 1;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error
                );
            }

            //foreach (string q in arr)
            //{

               
            //}
        }

        /**
         * RecogerDatosDeCamposHTML: Obtiene la información de los campos rellenados y 
         * forma una cadena estructurada
         * */
        private String RecogerDatosDeCamposHTML() {

            String strValue = String.Empty;

            for (int i = 0; i <= wB.Document.GetElementsByTagName("input").Count - 1; i++)
            {
                strValue = strValue + "[Id]<" + wB.Document.GetElementsByTagName("input")[i].Id + ">";
                if (wB.Document.GetElementsByTagName("input")[i].GetAttribute("type") == "checkbox")
                {
                    strValue = strValue + "[Value]<" + wB.Document.GetElementsByTagName("input")[i].GetAttribute("checked") + ">";
                }
                else
                {
                    strValue = strValue + "[Value]<" + wB.Document.GetElementsByTagName("input")[i].GetAttribute("value") + ">";
                }
            }

            for (int i = 0; i <= wB.Document.GetElementsByTagName("textarea").Count - 1; i++)
            {
                strValue = strValue + "[Id]<" + wB.Document.GetElementsByTagName("textarea")[i].Id + ">[InnerText]<" + wB.Document.GetElementsByTagName("textarea")[i].InnerText + ">";
            }

            return strValue;
        }

        /**
         * wB_DocumentCompleted: Se lanza cuando se ha cargado todo el documento HTML en el WebBrowser
         * 
        */
        private void wB_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            LlenarCamposHTML();
            LlenarCamposDerivables();   //Nombre anfitriona, direccion, ...
        }

        #region " Eventos "

            private void btnCerrar_Click(object sender, EventArgs e)
            {
                this.Dispose();
            }

            private void butGuardarDefinitiva_Click(object sender, EventArgs e)
            {
                try
                {
                   if( MessageBox.Show(
                        "¿Contiene la hoja datos definitivos? Si guardas ahora ya no se podrá modificar la hoja.", "Confirmación", 
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1
                     ) == DialogResult.Yes ){
                        
                        cMHI.rellenarHoja(RecogerDatosDeCamposHTML(), false); //Guardamos como definitivo 
                        this.butGuardarDefinitiva.Enabled = false;
                        this.butImprimirHoja.Enabled = true;
                        this.butGuardarBorrador.Enabled = false;
                        this.infoHoja[8] = false;
                        
                       MessageBox.Show("Se ha guardado correctamente.", "Información", 
                            MessageBoxButtons.OK, MessageBoxIcon.Information
                        );

                       foreach (ListaHojasInspeccionListener listener in listaHojasInspeccionListeners)
                           listener.guardarDefinitiva(this.intHoja);


                       //En caso de no haber inspeccion programada la programamos para un mes y año
                        String strTipoHoja = (String)this.infoHoja[7];
                        if (strTipoHoja.CompareTo("0000000001") == 0 &&
                            !cMHI.tieneSalonInspeccionPeriodicaProgramada())
                        {
                            EstablecerFechaInspeccionPeriodica programar = new EstablecerFechaInspeccionPeriodica((String)infoHoja[9]);
                            programar.StartPosition = FormStartPosition.CenterParent;
                            programar.ShowDialog(this);
                            cMHI.programarInspeccion(programar.Año.Value , programar.Mes.Value );
                        }
                        this.Dispose();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(
                        ex.Message, "Error", 
                        MessageBoxButtons.OK, MessageBoxIcon.Warning
                     );
                }
            }

            private void butGuardarBorrador_Click(object sender, EventArgs e)
            {
                try {

                    cMHI.rellenarHoja(RecogerDatosDeCamposHTML(), true);
                    MessageBox.Show("Se ha guardado el borrador correctamente.", "Información", 
                        MessageBoxButtons.OK, MessageBoxIcon.Information
                    );
                    this.Dispose();
                }
                catch (Exception ex) {
                    MessageBox.Show(ex.Message, "Error", 
                        MessageBoxButtons.OK, MessageBoxIcon.Error 
                    );
                }
            }

            private void butImprimirHoja_Click(object sender, EventArgs e)
            {

                if (!(Boolean)this.infoHoja[8])
                {
                    this.folderBrowserDialog1.ShowDialog();
                    if (this.folderBrowserDialog1.SelectedPath.Length > 0)
                    {
                        string ruta = this.folderBrowserDialog1.SelectedPath;
                        CRC_Imprimir.Printing_Form impr = new CRC_Imprimir.Printing_Form();
                        impr.Show(this);
                        String strTipoHoja = (String)this.infoHoja[7];
                        impr.Imprimir(this.infoHoja, ruta);
                    }
                }
            }

        #endregion

        #region " Listeners "

            public void añadirListaHojaInspeccionListener(ListaHojasInspeccionListener listener)
            {
                this.listaHojasInspeccionListeners.AddFirst(listener);
            }

            public void qitarListaHojaInspeccionListener(ListaHojasInspeccionListener listener)
            {
                this.listaHojasInspeccionListeners.Remove(listener);
            }

        #endregion
    }
}
